home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / morse / staton / speak.txt < prev    next >
Text File  |  1994-04-17  |  7KB  |  404 lines

  1. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;
  2. ;   COPYRIGHT (C) 1994 KEN STATON    ;
  3. ;         ALL RIGHTS RESERVED        ;
  4. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;
  5.  
  6. ;
  7. ;*************************************************************************
  8. ;
  9. ; INPUT ACC = relative index number of digitized speech block
  10. ;
  11. ; MODIFIES REGISTERS: R3, R5, R6, ACC, PSW:C
  12. ; MODIFIES Variables: SP_INDX, SPSTRT_H, SPSTRT_L, SPSTOP_H, SPSTOP_L,
  13. ;            BLK_IDX, PREV, TMP1
  14. ;
  15. ;    2Feb94    Fixed time variation between output values
  16. ;
  17.  
  18. ;MAKESOUND
  19.     JB    SPEAK,DO_SAYIT    ;Check if talking turned on/off
  20.     RET            ;Return from MAKESOUND if OFF
  21.  
  22. DO_SAYIT   
  23.     CLR    INT_EN        ;DISABLE INTS!
  24.     PUSH    DPL        ; SAVE DPTR
  25.     PUSH    DPH
  26.  
  27. ; MULT BY 4 TO INDEX INTO ARRAY WITH 4 BYTE ENTRIES...
  28.     CLR     C
  29.     RLC     A               ; MULT BY 2
  30.     CLR     C
  31.     RLC     A               ; MULT BY 2
  32.     MOV     SP_INDX,A       ; SAVE INDEX*4 (ea entry is 4 bytes)
  33.  
  34. ; SET DPTR TO START OF ARRAY...
  35.     MOV     DPTR,#SPCH_TBL
  36.  
  37. ; BUILD START & STOP...
  38.     MOVC    A,@A+DPTR
  39.     MOV     SPSTRT_H,A      ; KEEP HIGH START
  40.  
  41.     MOV     A,SP_INDX
  42.     INC     A               ; MOVE TO LOW BYTE OF START
  43.     MOVC    A,@A+DPTR
  44.     MOV     SPSTRT_L,A      ; KEEP LOW START
  45.  
  46.     MOV     A,SP_INDX
  47.     INC     A               ; MOVE TO HIGH BYTE OF STOP
  48.     INC     A
  49.     MOVC    A,@A+DPTR
  50.     MOV     SPSTOP_H,A      ; KEEP HIGH STOP
  51.  
  52.     MOV     A,SP_INDX
  53.     INC     A               ; MOVE TO LOW BYTE OF STOP
  54.     INC     A
  55.     INC     A
  56.     MOVC    A,@A+DPTR
  57.     MOV     SPSTOP_L,A      ; KEEP LOW STOP
  58.  
  59. ; NOW SET DPTR TO START...
  60.     MOV     DPL,SPSTRT_L    ; SET DPTR LOW
  61.     MOV     DPH,SPSTRT_H    ; SET DPTR HIGH
  62.     
  63.     MOV     BLK_IDX,#0      ; RESET BLOCK COUNTER
  64.     MOV     PREV,#REL_DC    ; START AT RELATIVE! DC LEVEL
  65.  
  66. ;
  67. ; SPEAK LOOP
  68. ;
  69. ; START WITH TEST FOR END OF SPEECH BLOCK
  70. ;
  71.  
  72. SAYLOOP 
  73.     MOV     A,SPSTOP_L      ; TEST IF DONE
  74.     CJNE    A,DPL,SAYHIGHL
  75.     MOV     A,SPSTOP_H
  76.     CJNE    A,DPH,SAYHIGHH
  77.  
  78. ;DONE!
  79.     MOV     P1,#ABS_DC    ; SET OUTPUT TO DC LEVEL WHEN DONE
  80.  
  81.     POP    DPH        ; CLEANUP - RESTORE DPTR
  82.     POP    DPL
  83.     SETB    INT_EN        ; ENABLE INTS
  84.     RET            ; DONE SPEAKING
  85.  
  86. ;
  87. ; Speak HIGH NYBBLE
  88. ;
  89.  
  90. SAYHIGHL
  91.     NOP            ;delay for high mov equiv
  92.     NOP            ;delay for high cjne equiv
  93.     NOP
  94. SAYHIGHH
  95.     MOV     A,BLK_IDX       ; TEST FOR END OF BLOCK
  96.     CJNE    A,#HALFBLK,NOBLKRST
  97.     MOV     BLK_IDX,#0      ; RESET BLOCK COUNTER FOR NEXT BLOCK
  98. NOBLKRST
  99.     CLR     A
  100.     MOVC    A,@A+DPTR       ; GET BYTE
  101.  
  102.     SWAP    A        ; SHIFT UPPER NYBBLE TO LOW 4 BITS
  103.     ANL     A,#0FH          ; MASK OUT UPPER 4 BITS
  104.     MOV     TMP1,A        ; TEMP SAVE HIGH DATA NYBBLE
  105.  
  106.     MOV     A,BLK_IDX       ; TEST IF Qfn
  107.     CJNE    A,#0,NOTQFNH
  108.     MOV     R3,TMP1        ;SET QFN FROM SAVED HIGH NYBBLE
  109.     SJMP    SAYLOW
  110.  
  111. NOTQFNH
  112.     MOV     A,TMP1        ; RESTORE HIGH DATA NYBBLE
  113.     LCALL   INVQFN
  114.     CLR     C
  115.     ADDC    A,PREV          ; A=A+C+PREV
  116.     MOV     PREV,A          ; SO, PREV=PREV+A
  117.  
  118.     LCALL   REL2ABS         ; CONVERT TO UNSIGNED ABS
  119.     MOV     P1,A            ; OUTPUT BYTE
  120.  
  121.                 ;
  122.     MOV     R6,#SP_DLY      ; SP_WAIT
  123. SPLOOPH DJNZ    R6,SPLOOPH      ;
  124.                 ;
  125.  
  126. ; NOW Speak LOW NYBBLE...
  127.  
  128.     NOP
  129.     NOP
  130.     NOP
  131.     NOP
  132.     NOP            ; delay for next byte equiv
  133. SAYLOW
  134.     CLR     A
  135.     MOVC    A,@A+DPTR       ; GET BYTE
  136.     NOP            ; delay for high swap equiv
  137.  
  138.     ANL     A,#0FH          ; MASK OUT UPPER 4 BITS
  139.     NOP
  140.     NOP
  141.     NOP
  142.     NOP
  143.     NOP            ; delay for high qfn test equiv
  144.     LCALL   INVQFN
  145.     CLR     C
  146.     ADDC    A,PREV          ; A=A+C+PREV
  147.     MOV     PREV,A          ; SO, PREV=PREV+A
  148.  
  149.     LCALL   REL2ABS         ; CONVERT TO UNSIGNED ABS
  150.     MOV     P1,A            ; OUTPUT BYTE
  151.  
  152.                 ;
  153.     MOV     R6,#SP_DLY      ; SP_WAIT
  154. SPLOOPL DJNZ    R6,SPLOOPL      ;
  155.                 ;
  156.  
  157. ; GET NEXT TWO NYBBLES (BYTE)
  158.  
  159.     INC     BLK_IDX
  160.     INC     DPTR            ; MUST INC PTR, > 256 BYTES
  161.  
  162.     LJMP    SAYLOOP        ; REPEAT
  163.  
  164. ;****************************************************************
  165. ;
  166. ; SPEAK SUPPORT SUBROUTINES....
  167. ;
  168.  
  169. ;****************************************************************
  170. ;
  171. ; REL2ABS
  172. ;
  173. ; CONVERTS RELATIVE (SIGNED) NUMBERS TO ABSOLUTE (UNSIGNED)
  174. ;       DPCM IS DONE USING SIGNED NUMBERS (2's complement)
  175. ;       SPEECH DIGITIZATION IS DONE USING UNSIGNED NUMBERS
  176. ; INPUT IS IN ACC
  177. ; OUTPUT IS IN ACC
  178. ;
  179. ;    Signed (DEC)    Signed (HEX)    UNSigned
  180. ;    -1        $FF        $7F
  181. ;    -2        $FE        $7E
  182. ;     .                 .
  183. ;     .                 .
  184. ;    -127        $81        $01
  185. ;    -128        $80        $00
  186. ;    +127        $7F        $FF
  187. ;    +126        $7E        $FE
  188. ;     .                 .
  189. ;     .                 .
  190. ;    +1        $01        $81
  191. ;     0        $00        $80
  192. ;
  193.  
  194. REL2ABS
  195.     CLR     C
  196.     ADDC    A,#128
  197.     RET
  198.  
  199.  
  200. ;
  201. ; INVERSE QUANTIZATION FUNCTION
  202. ; INPUT IN ACC
  203. ; OUTPUT IN ACC
  204. ;
  205.  
  206. INVQFN
  207.     INC    A        ; TABLE INDEX 0 = RET, SO OFFSET BY 1
  208.     CJNE    R3,#7,TRY6
  209.     NOP    ;1
  210.     NOP    ;2
  211.     NOP    ;3
  212.     NOP    ;4
  213.     NOP    ;5
  214.     NOP    ;6
  215.     NOP    ;7
  216.     NOP    ;8
  217.     NOP    ;9
  218.     NOP    ;10
  219.     LCALL    IQBASE7
  220.     RET
  221. TRY6    CJNE    R3,#6,TRY5
  222.     NOP    ;1
  223.     NOP    ;2
  224.     NOP    ;3
  225.     NOP    ;4
  226.     NOP    ;5
  227.     NOP    ;6
  228.     NOP    ;7
  229.     NOP    ;8
  230.     LCALL    IQBASE6
  231.     RET
  232. TRY5    CJNE    R3,#5,TRY4
  233.     NOP    ;1
  234.     NOP    ;2
  235.     NOP    ;3
  236.     NOP    ;4
  237.     NOP    ;5
  238.     NOP    ;6
  239.     LCALL    IQBASE5
  240.     RET
  241. TRY4    CJNE    R3,#4,TRY3
  242.     NOP    ;1
  243.     NOP    ;2
  244.     NOP    ;3
  245.     NOP    ;4
  246.     LCALL    IQBASE4
  247.     RET
  248. TRY3    CJNE    R3,#3,TRY2
  249.     NOP    ;1
  250.     NOP    ;2
  251.     LCALL    IQBASE3
  252.     RET
  253. TRY2    CJNE    R3,#2,TRY1
  254.     LCALL    IQBASE2
  255.     RET
  256. TRY1
  257.     LCALL    IQBASE1
  258.     RET
  259.  
  260. IQBASE1    MOVC    A,@A+PC
  261.     RET
  262.     .DB     0
  263.     .DB     1
  264.     .DB     2
  265.     .DB     3
  266.     .DB     4
  267.     .DB     5
  268.     .DB     6
  269.     .DB     7
  270.     .DB     -8              ; 1111 1000
  271.     .DB     -7              ; 1111 1001
  272.     .DB     -6              ; 1111 1010
  273.     .DB     -5              ; 1111 1011
  274.     .DB     -4              ; 1111 1100
  275.     .DB     -3              ; 1111 1101
  276.     .DB     -2              ; 1111 1110
  277.     .DB     -1              ; 1111 1111
  278.  
  279. IQBASE2    MOVC    A,@A+PC
  280.     RET
  281.     .DB     0
  282.     .DB     1
  283.     .DB     2
  284.     .DB     3
  285.     .DB     4
  286.     .DB     6
  287.     .DB     8
  288.     .DB     12
  289.     .DB     -13
  290.     .DB     -10
  291.     .DB     -7
  292.     .DB     -5
  293.     .DB     -4
  294.     .DB     -3
  295.     .DB     -2
  296.     .DB     -1
  297.  
  298. IQBASE3    MOVC    A,@A+PC
  299.     RET
  300.     .DB     0
  301.     .DB     1
  302.     .DB     2
  303.     .DB     3
  304.     .DB     6
  305.     .DB     9
  306.     .DB     15
  307.     .DB     24
  308.     .DB     -26
  309.     .DB     -17
  310.     .DB     -11
  311.     .DB     -7
  312.     .DB     -5
  313.     .DB     -3
  314.     .DB     -2
  315.     .DB     -1
  316.  
  317. IQBASE4    MOVC    A,@A+PC
  318.     RET
  319.     .DB     0
  320.     .DB     1
  321.     .DB     2
  322.     .DB     4
  323.     .DB     7
  324.     .DB     12
  325.     .DB     21
  326.     .DB     36
  327.     .DB     -38
  328.     .DB     -23
  329.     .DB     -14
  330.     .DB     -9
  331.     .DB     -5
  332.     .DB     -3
  333.     .DB     -2
  334.     .DB     -1
  335.  
  336. IQBASE5    MOVC    A,@A+PC
  337.     RET
  338.     .DB     0
  339.     .DB     1
  340.     .DB     2
  341.     .DB     4
  342.     .DB     8
  343.     .DB     14
  344.     .DB     26
  345.     .DB     47
  346.     .DB     -49
  347.     .DB     -29
  348.     .DB     -17
  349.     .DB     -10
  350.     .DB     -6
  351.     .DB     -4
  352.     .DB     -2
  353.     .DB     -1
  354.  
  355. IQBASE6    MOVC    A,@A+PC
  356.     RET
  357.     .DB     0
  358.     .DB     1
  359.     .DB     3
  360.     .DB     5
  361.     .DB     10
  362.     .DB     19
  363.     .DB     36
  364.     .DB     69
  365.     .DB     -72
  366.     .DB     -41
  367.     .DB     -23
  368.     .DB     -13
  369.     .DB     -7
  370.     .DB     -4
  371.     .DB     -2
  372.     .DB     -1
  373.  
  374. IQBASE7    MOVC    A,@A+PC
  375.     RET
  376.     .DB     0
  377.     .DB     1
  378.     .DB     3
  379.     .DB     6
  380.     .DB     11
  381.     .DB     23
  382.     .DB     45
  383.     .DB     90
  384.     .DB     -95
  385.     .DB     -52
  386.     .DB     -28
  387.     .DB     -15
  388.     .DB     -8
  389.     .DB     -5
  390.     .DB     -2
  391.     .DB     -1
  392.  
  393. ;
  394. ; SPEECH TABLE.  *** MUST *** have the same order as CODE_TBL.
  395. ; 26+10+3+5=44 ENTRIES @ 4 BYTES EACH = 176 BYTES TOTAL.
  396. ; SPEECH.TXT is compiled from a text source file into a text
  397. ; assembler source file and a binary data file using SPCH_LIB.C
  398. ;
  399.  
  400. SPCH_TBL
  401. #INCLUDE "SPEECH.TXT"
  402.  
  403.  
  404.